#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/timerfd.h>
#include <iostream>

// int timerfd_create(int clockid, int flags);
// clockid: CLOCK_REALTIME-系统实时时间，如果修改了系统时间就会出问题； 
// CLOCK_MONOTONIC-从开机到现在的时间是⼀种相对时间；
// flags: 0-默认阻塞属性
// int timerfd_settime(int fd, int flags, struct itimerspec *new, struct itimerspec *old);
//     fd: timerfd_create返回的⽂件描述符
//     flags: 0-相对时间， 1-绝对时间；默认设置为0即可.
//     new： ⽤于设置定时器的新超时时间
//     old： ⽤于接收原来的超时时间
//     struct timespec {
//      time_t tv_sec; /* Seconds */
//      long tv_nsec; /* Nanoseconds */
//     };
//     struct itimerspec {
//      struct timespec it_interval; /* 第⼀次之后的超时间隔时间 */
//      struct timespec it_value; /* 第⼀次超时时间 */
//     };
//    定时器会在每次超时时，自动给fd中写⼊8字节的数据，表示在上⼀次读取数据到当前读取数据期间超时了多少次。

int main()
{
    int timerfd  = timerfd_create(CLOCK_MONOTONIC,0);
    if(timerfd<0)
    {
        perror("timerfd_create error");
        return -1;
    }
    struct itimerspec itime;
    itime.it_value.tv_sec = 1;
    itime.it_value.tv_nsec = 0;//第一次超时时间为1s
    itime.it_interval.tv_sec = 3;
    itime.it_interval.tv_nsec = 0;//第一次超时后,每次超时的时间间隔
    timerfd_settime(timerfd,0,&itime,nullptr);
    while(true)
    {
        uint64_t times;
        sleep(10);
        int ret = read(timerfd,&times,8);
        if(ret<0)
        {
            perror("read error");
            return -1;
        }
        printf("超时了,距离上一次超时了%ld次\n",times);
    }
    close(timerfd);
    return 0;
}
